/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Threads;

import Monitores.MonitorFicherosDescargados;
import Monitores.MonitorValoresBdToPDF;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.logging.Level;
import java.util.logging.Logger;
import utilidades.ConstructorQuery;
import utilidades.GestorBD;
import utilidades.LectorValores;

/**
 * Thread que coge paths del MonitorFicherosDescargados, lo abre y a medida
 * que lee el CSV, va creando querys y almacenando dichos datos en BD,
 * luego almacena el valor de los datos almacenados en MonitorValoresBdToPDF.
 * @author felipe
 */
public class ThreadEscrituraBD implements Runnable {

    private final MonitorFicherosDescargados monitorListaFicheros;
    private final GestorBD conexion;
    private final ConstructorQuery constructorQuery;
    private FileInputStream fstream;
    private BufferedReader buffer;
    private Boolean flag;
    private final MonitorValoresBdToPDF monitorValoresBdToPDF;

    public ThreadEscrituraBD(MonitorFicherosDescargados monitorListaFicheros,
            MonitorValoresBdToPDF monitorValoresBdToPDF) {
        this.monitorListaFicheros = monitorListaFicheros;
        this.monitorValoresBdToPDF = monitorValoresBdToPDF;
        this.conexion = new GestorBD();
        this.constructorQuery = new ConstructorQuery();
        this.flag = true;
    }

    @Override
    public void run() {
        while (flag) {
            String path = monitorListaFicheros.getFichero();
            if (path != null) {
                String id = constructorQuery.parseadorPath(path);
                if (monitorValoresBdToPDF.existeValorEnCSV(id)) {
                    try {
                        conexion.abrir();
                        fstream = new FileInputStream(path);
                        buffer = new BufferedReader(new InputStreamReader(fstream));
                        String strLinea = buffer.readLine();
                        while ((strLinea = buffer.readLine()) != null) {
                            conexion.insertarYBorrarLinea_s(constructorQuery.constructorQueryInsert(strLinea, id));
                        }
                        monitorValoresBdToPDF.putValor(id);
                    } catch (IOException ex) {
                        Logger.getLogger(LectorValores.class.getName()).log(Level.SEVERE, null, ex);
                    } finally {
                        cerrarStreamYBuffer();
                        conexion.cerrar();
                    }
                }
            } else {
                flag = false;
            }
        }
    }

    /**
     * Cierra el stream de lectura al fichero y el buffer temporal.
     */
    private void cerrarStreamYBuffer() {
        try {
            buffer.close();
            fstream.close();
        } catch (IOException ex) {
            Logger.getLogger(LectorValores.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}